%% @doc テンプレートコンテキスト
%%
-module(templel_context).
-export([get_by_key/1,get_by_key/2,get_by_index/1,get_by_index/2]).


%% @spec get_by_key(context(), string()|{name,any(),string()}) -> term()
%%
get_by_key(D={dict,_,_,_,_,_,_,_,_}, {name,_,Key}) ->
	get_by_key(D, Key);
get_by_key(D={dict,_,_,_,_,_,_,_,_}, Key) ->
	case dict:find(Key, D) of
		{ok, V=[E|_]} ->
			case is_tuple(E) of
				true -> dict:from_list(V);
				false -> V
			end;
		{ok, V} -> V;
		error -> erlang:error({novalue, Key})
		%error -> {error, {novalue, Key}}
	end;
get_by_key(D, Key) ->
    erlang:error({badargs,[D,Key]}).
    %{error, {badargs,[D,Key]}}.

%% @spec get_by_key(string()|{name,any(),string()}) -> term()
%%
get_by_key(Key) ->
	D = templ_dict:get_context(),
	get_by_key(D, Key).


%% @spec get_by_index(context()|lcontext(), 
%%                    integer()|{integer,integer(),integer()}) -> term()
%%
get_by_index(Dict={dict,_,_,_,_,_,_,_,_}, {integer,_,Idx}) ->
	get_by_index(Dict, Idx);
get_by_index(Dict={dict,_,_,_,_,_,_,_,_}, Idx) when is_integer(Idx) ->
	List = dict:to_list(Dict),
	get_by_index(List, Idx);

get_by_index([], _) ->
	erlang:error(outofbounds);
get_by_index([{_,V}|_], 0) ->
	V;
get_by_index([{_,_}|R], Idx) when is_integer(Idx) ->
	get_by_index(R, Idx-1);
get_by_index(A, Idx) ->
	erlang:error({badargs,[A,Idx]}).

%% @spec get_by_index(integer()|{integer,integer(),integer()}) -> term()
%%
get_by_index(Idx) ->
	D = templ_dict:get_context(),
	get_by_index(D, Idx).
